package gui.logado.mensagens.receber;

import conexao.Http;
import conexao.HttpData;
import conexao.HttpListener;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Vector;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.*;
import recados.Recados;

public class ExibeMensagem extends Form implements CommandListener, HttpListener, Runnable {

    private final Command cmdVoltar;
    private final Command cmdResponder;
    private final Command cmdDetalhes;
    private final Command cmdAnexo;
    private String id;
    private final CaixaEntrada entrada;
    private final Command cmdExcluir;

    public ExibeMensagem(String id) {
        super("");

        this.entrada = Recados.getInstance().getEntrada();
        Mensagem m = entrada.getMensagem(id);
        setTitle(m.getDe());

        this.id = id;

        setContent(m.getMensagem());

        cmdResponder = new Command("Responder", Command.SCREEN, 0);
        cmdAnexo = new Command("Salv. Arqv.", "Salvar Arquivo", Command.SCREEN, 1);
        cmdDetalhes = new Command("Detalhes", Command.SCREEN, 2);
        cmdExcluir = new Command("Excluir", Command.SCREEN, 3);
        cmdVoltar = new Command("Voltar", Command.BACK, 4);

        addCommand(cmdResponder);
        if (m.getTipo().equals("arquivo")) {
            addCommand(cmdAnexo);
        }
        
        addCommand(cmdDetalhes);
        addCommand(cmdExcluir);
        addCommand(cmdVoltar);

        setCommandListener(this);
    }

    public void apaga() {
        Http http = new Http("Deletando");
        HttpData dados = new HttpData();
        http.setHttpData(dados);

        dados.setPagina("/deleta_recado.php");
        http.setListener(new DeletaListner(this));

        Mensagem m = entrada.getMensagem(id);

        dados.put("ids", m.getId());

        Recados ins = Recados.getInstance();

        dados.put("nome", ins.getLoginConfig().getNome());
        dados.put("senha", ins.getLoginConfig().getSenha());

        Recados.setCurrent(http);

        http.doPost(false);
    }

    private class DeletaListner implements HttpListener {

        private final ExibeMensagem ex;

        private DeletaListner(ExibeMensagem ex) {
            this.ex = ex;
        }

        public void requisicaoConcluida(DataInputStream in) {
            String st = Http.readLine(in);

            Recados midlet = Recados.getInstance();

            if (st.equals("erro")) {
                String me = Http.readLine(in);
                Recados.setCurrent(new Alert("Erro", me, null, AlertType.ERROR), midlet.getEntrada());
                return;
            }

            entrada.remove(id);

            Recados.setCurrent(entrada);
        }

        public void requisicaoCancelada() {
            Recados.setCurrent(ex);
        }

        public void falhaRequisiçao(String mensagem) {
            Recados.setCurrent(new Alert("Erro", mensagem, null, AlertType.ERROR), ex);
        }
    }

    public void setMensagem(String id) {
        Mensagem mensagem = entrada.getMensagem(id);
        setTitle(mensagem.getDe());
        setContent(mensagem.getMensagem());
        this.id = id;
    }

    public void commandAction(Command c, Displayable d) {
        Recados midlet = Recados.getInstance();
        if (c == cmdVoltar) {
            Recados.setCurrent(midlet.getEntrada());
        } else if (c == cmdResponder) {
            midlet.getEnviar().setBack(this);
            midlet.getEnviar().getMensagem().setString("");
            midlet.getEnviar().getPara().setString(entrada.getMensagem(id).getDe());
            Recados.setCurrent(midlet.getEnviar());
        } else if (c == cmdDetalhes) {
            DetalhesMensagem de = new DetalhesMensagem(entrada.getMensagem(id), midlet);
            de.setBack(this);
            Recados.setCurrent(de);
        } else if (c == cmdAnexo) {
            Anexo a = new Anexo(entrada.getMensagem(id));
            a.setBack(this);
            Recados.setCurrent(a);
        } else if (c == cmdExcluir) {
            apaga();
        }
    }

    public void requisicaoConcluida(DataInputStream in) {
        Recados midlet = Recados.getInstance();

        String linha = Http.readLine(in);

        if (linha.equals("erro")) {
            String segundaLinha = Http.readLine(in);
            Recados.setCurrent(new Alert("Erro", segundaLinha, null, AlertType.ERROR), this);
            return;
        }

        if (linha.equals("vazio")) {
            Recados.setCurrent(new Alert("Erro","Mensagem não encontrada", null, AlertType.INFO), this);
            return;
        }

        int length = Integer.parseInt(linha);

        byte[] mensagemData = new byte[length];

        try {
            in.readFully(mensagemData);
        } catch (IOException ex) {
            Recados.setCurrent(new Alert("Erro", "Problema ao baixar mensagem: " + ex.getMessage(), null, AlertType.ERROR), this);
            return;
        }

        String processa;

        try {
            processa = new String(mensagemData, "UTF-8");
        } catch (Exception ex) {
            processa = new String(mensagemData);
        }

        entrada.setLida(id); 
        Mensagem mensagem = entrada.getMensagem(id);
        mensagem.setMensagem(processa);
        mensagem.setBaixada(true);
        mensagem.salva();
        setTitle(mensagem.getDe());
        setContent(mensagem.getMensagem());
        Recados.setCurrent(this);
    }

    private void setContent(String msg) {
        deleteAll();

        Vector objs = new Vector(1);
        String buffer = msg;

        while (true) {
            int img_start = buffer.indexOf("<img ");
            int img_end = buffer.indexOf('>', img_start);

            if (img_start < 0) {
                //Nao tem mais imagens
                //Adiciona o que sobrou do buffer
                objs.addElement(buffer);
                break;
            }

            //Adiciona o que ta antes da imagem se a prieira coisa (que ta no index 0) nao for imagem
            if (img_start > 0) {
                objs.addElement(buffer.substring(0, img_start));
            }

            //Pega pedaço
            String codigo = buffer.substring(img_start, img_end + 1);

            //Deixa so o que tem depois da imagem no buffer
            buffer = buffer.substring(img_end + 1);

            String url = getProperty(codigo, "src");
            String alt = getProperty(codigo, "alt");

            Image img = null;

            if (url.startsWith("http://")) {
                if (Recados.getInstance().getConfig().isImagensMensagens()) {
                    try {
                        HttpConnection conn = (HttpConnection) Connector.open(url);
                        DataInputStream imagem = conn.openDataInputStream();
                        img = Image.createImage(imagem);
                    } catch (IOException ex) {
                        //Qualquer excessao deixa a imagem nula
                        img = null;
                    }
                }
            } else {
                if (url.endsWith(".png") && Recados.getInstance().getConfig().isSmilesMensagens()) {
                    url = "/smiles/" + url;
                    try {
                        img = Image.createImage(url);
                    } catch (IOException ex) {
                        //Qualquer excessao deixa a imagem nula
                        img = null;
                    }
                }
            }

            ImageItem imageItem = new ImageItem(null, img, Item.LAYOUT_DEFAULT, alt);
            objs.addElement(imageItem);
        }

        for (int i = 0; i < objs.size(); i++) {
            Object item = objs.elementAt(i);

            if (item instanceof String) {
                append((String) item);
            } else if (item instanceof ImageItem) {
                append((ImageItem) item);
            }
        }
    }

    public String getProperty(String codigo, String prop) {
        String open = prop + "=\"";

        int src = codigo.indexOf(open);
        int src_end = codigo.indexOf('"', src + 5);

        if (src < 0 || src_end < 0) {
            return "";
        }

        String url = codigo.substring(src + open.length(), src_end);

        return url;
    }

    public void requisicaoCancelada() {
        Recados.setCurrent(this);
    }

    public void falhaRequisiçao(String mensagem) {
        Recados.setCurrent(new Alert("Erro", mensagem, null, AlertType.ERROR), this);
    }

    public void run() {
        Http http = new Http("Recuperando");
        HttpData dados = new HttpData();
        http.setHttpData(dados);

        dados.setPagina("/recuperar_recado.php");
        http.setListener(this);

        Recados midlet = Recados.getInstance();

        dados.put("id", entrada.getMensagem(id).getId());
        dados.put("nome", midlet.getLoginConfig().getNome());
        dados.put("senha", midlet.getLoginConfig().getSenha());

        Recados.setCurrent(http);

        http.doPost(false);
    }
}
